import * as winston from 'winston';
import DailyRotateFile = require('winston-daily-rotate-file');

const format = winston.format;

type LoggerType = 'info' | 'error';

const customFormat = format.combine(
  format.colorize(),
  format.timestamp({
    format: 'YYYY/MM/DD HH:mm:ss',
  }),

  format.splat(),
  format.align(),
  format.printf((info) => {
    return `[${info.timestamp}] : ${info.message}`;
  }),
);

class _ILogger {
  private infoLogger: winston.Logger | undefined = undefined;
  private errorLogger: winston.Logger | undefined = undefined;

  bootstrap(fileDir?: string) {
    this.infoLogger = this.createLogger('info', fileDir);
    this.errorLogger = this.createLogger('error', fileDir);
  }

  createLogger(loggerType: LoggerType, fileDir?: string): winston.Logger {
    const transports: winston.transport[] = [
      new winston.transports.Console({
        level: 'info',
      }),
    ];
    transports.push(
      new DailyRotateFile({
        filename: `${fileDir ?? 'logs'}/${loggerType}_%DATE%.log`,
        datePattern: 'YYYY-MM-DD',
        zippedArchive: true,
        maxSize: '20m',
        maxFiles: '14d',
      }),
    );
    return winston.createLogger({
      exitOnError: false,
      format: customFormat,
      transports,
    });
  }

  info(message: string): void {
    this.infoLogger?.info(message);
  }

  error(message: string): void {
    this.errorLogger?.error(message);
  }
}

const ILogger = new _ILogger();

export default ILogger;
